1 module unde.games.dizzy.omega.animations.stone_00;
2 
3 import derelict.opengl3.gl;
4 import std.conv;
5 import std.math;
6 import unde.games.collision_detector;
7 import unde.games.object;
8 import unde.games.renderer;
9 import unde.global_state;
10 
11 class Stone00:StaticGameObject
12 {    
13     StaticGameObject the_hero;
14 
15     this(MainGameObject root, StaticGameObject hero)
16     {
17         frame = -1;
18         the_hero = hero;
19 
20         models["stone-00"] = root.models["stone-00"];
21         models["small-stone-00"] = root.models["small-stone-00"];
22         super(root);
23     }
24 
25     override void draw(GlobalState gs)
26     {
27         if (abs(root.scrx-0.0) > 16.0 ||
28             abs(root.scry-0.0) > 9.0) return;
29         
30         float f = 0.0;
31         if (frame >= 0)
32         {
33             f = root.frame - frame;
34         }
35         
36         glPushMatrix();
37         if (f <= 0.0)
38         {
39             glTranslatef(9.9, 1.2, 0.7);
40         }
41         else if (f < 100.0)
42         {
43             glTranslatef(9.9 - (9.9-6.7)*f/100.0, 1.2 - (1.2-0.7)*f/100.0, 0.7);
44             glRotatef(83.0*f/100.0, 0.0, 0.0, 1.0);
45         }
46         else if (f < 200.0)
47         {
48             glTranslatef(6.7 - (6.7-4.1)*(f-100.0)/100.0, 0.7 - (0.7+3.6)*(f-100.0)/100.0, 0.7);
49             glRotatef(83.0+(222.0-83.0)*(f-100.0)/100.0, 0.0, 0.0, 1.0);
50             root.collision_objects["solid"]["Stone"] = root.collision_objects["temp-solid"]["Stone"];
51             reset_collision_cache();
52         }
53         else if (f < 250.0)
54         {
55             glTranslatef(4.1, -3.6 - (-3.6+6.1)*(f-200.0)/50.0, 0.7);
56             glRotatef(222.0, 0.0, 0.0, 1.0);
57         }
58         else
59         {
60             glTranslatef(4.1, -6.1, 0.7);
61             glRotatef(222.0, 0.0, 0.0, 1.0);
62         }
63         recursive_render(gs, models["stone-00"]);
64         glPopMatrix();
65 
66         glPushMatrix();
67         if (f <= 0.0)
68         {
69             glTranslatef(8.7, -0.6, 0.7);
70             recursive_render(gs, models["small-stone-00"]);
71         }
72         else if (f < 300.0)
73         {
74             glTranslatef(8.7-f/5.0, -0.6-f/10.0, 0.7);
75             recursive_render(gs, models["small-stone-00"]);  
76         }
77         glPopMatrix();
78     }
79     
80     override bool tick(GlobalState gs)
81     {
82         if (frame < 0 && the_hero.x > 6.6)
83         {
84             frame = root.frame;
85         }
86         
87         return true;
88     }
89 
90     override void load(string[string] s)
91     {
92         if ("stone00-frame" in s)
93             frame = s["stone00-frame"].to!(long);
94         else
95             frame = -1;
96 
97         float f = 0.0;
98         if (frame >= 0)
99         {
100             f = root.frame - frame;
101         }
102         
103         if (f > 100.0)
104         {
105             root.collision_objects["solid"]["Stone"] = root.collision_objects["temp-solid"]["Stone"];
106             reset_collision_cache();
107         }
108         else
109         {
110             root.collision_objects["solid"]["Stone"] = null;
111             root.collision_objects["solid"].remove("Stone");
112             reset_collision_cache();
113         }
114     }
115 
116     override void save(ref string[string] s)
117     {
118         if (frame >= 0)
119         {
120             s["stone00-frame"] = frame.to!(string);
121         }
122     }    
123 }